# coding:utf-8

from subprocess import run
import winreg
import ctypes
import sys


class win:
    '''
    主要用于windows常用设置
    '''

    # 判断是否是管理员运行,不是的话运行管理员模式
    def is_admin(self):
        '''
        管理员身份验证
        '''
        try:
            if ctypes.windll.shell32.IsUserAnAdmin():
                return None
            else:
                print('请使用管理员身份运行')
                input('按回车键继续。。')
                sys.exit()
        except:
            print('请使用管理员身份重新运行')
            input('按回车键继续。。')
            sys.exit()

    # 执行cmd命令函数
    def exe(self, command):
        '''
        执行cmd命令
        command(字符串)：需要执行的命令
        '''
        back = run(command, shell=True, capture_output=True, text=True)
        return back

    # 修改注册表
    def reg(self, root, path, name, genre, value):
        '''
        修改注册表
        '''
        key = winreg.OpenKey(root, path, 0, winreg.KEY_ALL_ACCESS)
        info = winreg.QueryInfoKey(key)[1]
        for i in range(info):
            name_temp, value_temp, genre_temp = winreg.EnumValue(key, i)
            if name == name_temp:
                try:
                    winreg.SetValueEx(key, name, 0, genre, value)
                    return True
                except (Exception, BaseException)as e:
                    print(e)
                    return False
            else:
                if i == info-1:
                    print('找不到项值{},已新建'.format(name))
                    try:
                        winreg.CreateKeyEx(key,name)
                        winreg.SetValueEx(key, name, 0, genre, value)
                    except (Exception, BaseException) as e:
                        print('新建失败')
                        print(e)
                        return False
                    return True


    # guest账户操作
    def guest(self, conf):
        '''
        操作guest账户状态并设置无密码
        传入参数布尔
        '''
        # 根据conf参数
        if conf:
            print('正在激活Guest账户并删除密码')
            # 激活guest账户
            back = self.exe('net user guest /active:yes')
            if back.returncode == 0:
                print('激活Guest账户成功')
                # 删除guest账户密码
                back = self.exe('net user guest ""')
                if back.returncode == 0:
                    print('删除Guest密码成功')
                else:
                    print('删除Guest密码失败，请手动删除')
            else:
                print('激活Guest账户失败，请手动开启')
                print('删除Guest密码失败，请手动删除')
        else:
            print('正在关闭Guest账户')
            back = self.exe('net user guest /active:no')
            if back.returncode == 0:
                print('关闭Guest账户成功')
            else:
                print('关闭Guest账户失败，请手动关闭')
        return back

    # 防火墙操作
    def net_wall(self, conf):
        '''
        关闭Windows防火墙，
        win10已测试
        '''
        if conf:
            print('正在关闭防火墙。。。')
            back = self.exe('netsh advfirewall set allprofiles state off')
            if back.returncode == 0:
                print('关闭防火墙成功')
            else:
                print('关闭防火墙失败，请手动关闭。')
        else:
            print('正在开启防火墙。。。')
            back = self.exe('netsh advfirewall set allprofiles state on')
            if back.returncode == 0:
                print('开启防火墙成功')
            else:
                print('开启防火墙失败，请手动开启。')
        return back

    # （win7专用）允许本地策略从网络访问
    def st_forceguest(self, conf):
        '''
        允许本地策略从网络访问
        参数：1仅来宾，0经典
        注册表地址：[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]，forceguest",DWORD类型
        '''
        standard = r'SYSTEM\CurrentControlSet\Control\Lsa'
        name = r'forceguest'
        if conf:
            back = self.reg(winreg.HKEY_LOCAL_MACHINE,
                            standard, name, winreg.REG_SZ, 1)
            if back:
                print('修改允许本地策略从网络访问为‘仅来宾’成功')
            else:
                print('修改允许本地策略从网络访问为‘仅来宾’未成功,请手动修改')
        else:
            back = self.reg(winreg.HKEY_LOCAL_MACHINE,
                            standard, name, winreg.REG_SZ, 0)
            if back:
                print('修改允许本地策略从网络访问为‘经典’成功')
            else:
                print('修改允许本地策略从网络访问为‘经典’未成功,请手动修改')

    # (win7)帐户: 使用空密码的本地帐户只允许进行控制台登录
    def st_LimitBlankPasswordUse(self, conf):
        '''
        帐户: 使用空密码的本地帐户只允许进行控制台登录
        参数：1启用，0不启用
        注册表地址：[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]，LimitBlankPasswordUse，REG_DWORD类型
        '''
        standard = r'SYSTEM\CurrentControlSet\Control\Lsa'
        name = r'LimitBlankPasswordUse'
        if conf:
            back = self.reg(winreg.HKEY_LOCAL_MACHINE,
                            standard, name, winreg.REG_SZ, 1)
            if back:
                print('修改使用空密码的本地帐户只允许进行控制台登录为‘启用’成功')
            else:
                print('修改使用空密码的本地帐户只允许进行控制台登录为‘启用’未成功,请手动修改')
        else:
            back = self.reg(winreg.HKEY_LOCAL_MACHINE,
                            standard, name, winreg.REG_SZ, 0)
            if back:
                print('修改使用空密码的本地帐户只允许进行控制台登录为‘未启用’成功')
            else:
                print('修改使用空密码的本地帐户只允许进行控制台登录为‘未启用’未成功,请手动修改')

    # (win7)注册表保存账户密码自动登录
    def winlogin(self, name, passw):
        '''
        (win7)注册表保存账户密码自动登录
        name:账户
        passw：密码
        '''
        print('账户密码正在保存至系统中。。。')
        back = self.reg(winreg.HKEY_LOCAL_MACHINE,
                        r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon', r'AutoAdminLogon', winreg.REG_SZ, '1')
        if back == True:
            back = self.reg(winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon',
                            r'DefaultUserName', winreg.REG_SZ, name)
            if back == True:
                back = self.reg(winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon',
                                'DefaultPassword', winreg.REG_SZ, passw)
                if back == True:
                    return True
                else:
                    return False
            else:
                print('设置账户失败')
                return False
        else:
            print('打开登录保存功能失败')
            return False


win = win()
